// 动态路由
import useMainStore from '@/store/modules/user'
import router from '@/router'
import { RouteLocationNormalized, NavigationGuardNext } from 'vue-router'
import { toRaw } from 'vue'

export const initDynamicRouter = async (
  to: RouteLocationNormalized,
  next: NavigationGuardNext
) => {
  // 导入views所有页面文件（这里是 VITE 导入规范）
  const modules = import.meta.glob('@/views/**/*.vue')

  const { setRoutes } = useMainStore()
  // 向 pinia 仓库增加路由菜单
  await setRoutes()
  // 获取 pinia 仓库中的路由菜单
  const { menuList } = await useMainStore()
  // 将vue3代理的数据转换为普通数据
  // JSON.parse(JSON.stringify(menuList)) 也可以
  const newMenuList: NMenu.IMenu[] = toRaw(menuList)
  console.log(newMenuList)

  /**
   * 动态添加路由
   *
   * @param pName 父菜单路由名称
   * @param menu 路由菜单
   * @return {void}
   */
  const addRoute = (pName: string, menu: NMenu.IMenu[]) => {
    menu.forEach(async (item) => {
      if (Array.isArray(item.children)) {
        router.addRoute(item.parentId == 0 ? 'layout' : pName, {
          path: item.path,
          name: item.name,
          meta: {
            title: item.name,
          },
          redirect: getRedirectPath(item.children),
          children: [],
        })
        addRoute(item.name, item.children)
      } else {
        router.addRoute(item.parentId == 0 ? 'layout' : pName, {
          path: item.path,
          name: item.name,
          meta: {
            title: item.name,
          },
          component: modules[`/src/views/${item.component}.vue`],
        })
      }
    })
  }

  /**
   * 子路由路径
   *
   * @param menu 父菜单中的子菜单
   * @return {string} 子菜单路由路径
   */
  const getRedirectPath = (menu: NMenu.IMenu[]) => {
    const index = menu.findIndex((item) => !item.children)
    return menu[index].path
  }

  addRoute('', newMenuList)
  // 放行
  next({ path: to.path, replace: true })
}
